/**
 * @file Strategy.h
 * @author Lost
 * @date 五月 2018
 * @brief 
 * 策略类
 */

#ifndef __STRATEGY_H__
#define __STRATEGY_H__


#include "Frame.h"


#include <vector>

using namespace std;

class Snake;
class Frame;
/**
 * @brief 策略类
 */
class CStrategy :public CBaseStrategy
{
public:
    CStrategy( CFrame &cFrame, CSnake &Snake );
    ~CStrategy();

public:
    /**
     * @brief 获取方向
     */
    virtual EDirType GetDir();

private:
    /**
     * @brief 收集食物
     */
    bool CollectFood();

    /**
     * @brief 获取最近食物
     */
    bool GetNearestFood();

    /**
     * @brief 广度优先查找路径
     */
    EDirType GotoPosByBreadthFirstResearch(const Pos &stSrc, const Pos &stDst, vector<EDirType> &vecDir, const vector<Pos> &vecForecast = vector<Pos>());

    /**
     * @brief 追尾巴
     */
    EDirType FollowTail(const Pos &stHead, const vector<Pos> &vecForecast = vector<Pos>());


    /**
     * @brief 获取下一点
     */
    const Pos GetNextPos(const Pos &stPos, EDirType eDir);

    /**
     * @brief 获取相反的点
     */
    EDirType ReverseDir(EDirType eDir);

    /**
     * @brief 获取相邻两点的方向
     */
    EDirType GetNearPosDir(const Pos &stSrcPos, const Pos &stDesPos);

    /**
     * @brief 获取周围点
     */
    void GetRoundPos(const Pos &stSrcPos, vector<Pos> &vecRoundPos, const int iDistance = 1);

    /**
     * @brief 获取两点距离
     */
    int GetDistance(const Pos &stSrcPos, const Pos &stDesPos);

    /**
     * @brief 获取两点比较远的方向
     */
    EDirType GetFarDir(const Pos &stSrcPos, const vector<EDirType> &vecSrcDir, const Pos &stDesPos);

    /**
     * @brief 获取两点比较近的方向
     */
    EDirType GetNearDir(const Pos &stSrcPos, const vector<EDirType> &vecSrcDir, const Pos &stDesPos);

    /**
     * @brief 获取下一点
     */
    EMapUnitType  (* CreateTmpMap(const vector<Pos> &vecForecast = vector<Pos>()))[MAX_MAP_WIDTH];
private:
    /*!< 食物坐标 */
    Pos m_Food;

    /*!< 框架 */
    CFrame &m_cFrame;

    /*!< 蛇 */
    CSnake &m_cSnake;
};


#endif
